# 垃圾回收（GC）负责的主要任务
# 1，为新生成的对象分配内存
# 2，识别那些垃圾对象
# 3，从垃圾对象那回收内存
import sys
import psutil
import os
import gc
print(gc.get_threshold())
def showMemSize(tag):
    pid=os.getpid()#获取进程pid
    p=psutil.Process(pid)#获取进程对象
    info=p.memory_info()#获取内存信息
    memory=info.rss/1024/1024#计算内存大小
    print('{} memory used:{} MB'.format(tag,memory))
    pass
# 验证循环引用的情况
def func():
    showMemSize('初始化')
    a = [i for i in range(1000000)]
    b = [i for i in range(1000000)]
    a.append(b)
    b.append(a)
    showMemSize('创建列表对象ab之后')
    # print(sys.getrefcount(a))
    # print(sys.getrefcount(b))
    # del a
    # del b
    pass
func()
# 如果你删除变量a和b，变量a和b不再指向任何对象，因此它们所持有的对列表a和b的引用被移除。但是，由于列表a和b相互引用，它们的引用计数并没有降到0。列表a仍然有一个由列表b持有的引用，而列表b也有一个由列表a持有的引用，它们各自的引用计数保持为1。
gc.collect()#手动释放
showMemSize('完成时候的')
# 理论上程序新建的每个对象都应该最终被释放掉，当新建的计数值与被释放对象的计数值之间的差异超过某个阈值，Python的gc模块就启动了。